﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace LectorExpediciones
{
    public partial class ControlLotes : UserControl
    {
        public ExpedicionPallets expedicion;
        private ColumnSorter.ListViewColumnSorter lvwColumnSorter;

        private bool expedicionModificada = false;

        public ControlLotes()
        {
            InitializeComponent();
            SetStyle(ControlStyles.ResizeRedraw, true);
            redimesiona(GestorVentanas.getInstancia().getWidthVentanaPrincipal(),
                        GestorVentanas.getInstancia().getHeightVentanaPrincipal());
            textBoxCodigoLote.Focus();
            Location = new Point(0, 0);
            lvwColumnSorter = new ColumnSorter.ListViewColumnSorter();
            this.listaLotes.ListViewItemSorter = lvwColumnSorter;
            lvwColumnSorter.tablaExpediciones = 0;
        }

        public void setExpedicion(ExpedicionPallets exp)
        {
            this.expedicion = exp;
            actualizarListaPallets();
            //nombreClienteLabel.Text = 
        }

        public void setDatosCliente(string expediente, string cliente, DateTime fecha)
        {
            //label3.Text = cliente;
            textBoxCliente.Text = cliente;
            textBoxExpediente.Text = expediente;
            textBoxFecha.Text = fecha.ToString();
        }

        public void setNombreCliente(string cliente)
        {
            //label3.Text = cliente;
            textBoxCliente.Text = cliente;
        }

        private void actualizarListaPallets()
        {
            listaPalletsExpedicion.Clear();
            listaLotes.Items.Clear();
            List<Pallet> listaPallets = expedicion.getPallets();
            for (int i = 0; i < listaPallets.Count; i++)
            {
                Pallet pallet = listaPallets.ElementAt(i);
                if (pallet.getId() != -1)
                {
                    ListViewItem item = crearItemPallet(pallet);
                    listaPalletsExpedicion.Add(pallet);
                    listaLotes.Items.Add(item);
                }
            }
        }
        
        private List<Pallet> listaPalletsExpedicion = new List<Pallet>();
        private List<Pallet> listaPalletsExpedicionEliminados = new List<Pallet>();  //controla que no quite uno ya guardado y lo vuelva a poner

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13 && textBoxCodigoLote.Text != String.Empty)
            {
                Pallet nuevoPallet = GestorConexion.getInstancia().ExistePallet(textBoxCodigoLote.Text);
                if (nuevoPallet == null)
                {
                    MessageBox.Show("El código introducido no es un código válido", "Error al expedir lote", MessageBoxButtons.OK);
                    textBoxCodigoLote.Clear();
                    textBoxCodigoLote.Focus();
                    return;
                }

                if ((nuevoPallet.estaExpedido() && !estaEnListaEliminados(nuevoPallet)) || estaEnListaAgregador(nuevoPallet))
                {
                    MessageBox.Show("El lote que está introduciendo ya ha sido expedido", "Error al expedir lote", MessageBoxButtons.OK);
                    textBoxCodigoLote.Clear();
                    textBoxCodigoLote.Focus();
                    return;
                }

                ListViewItem item = crearItemPallet(nuevoPallet);
                expedicionModificada = true;
                listaLotes.Items.Add(item);
                listaPalletsExpedicion.Add(nuevoPallet);
                quitarListaEliminados(nuevoPallet);
                expedicion.addPallet(nuevoPallet);                
                textBoxCodigoLote.Clear();
            }
        }

        private void quitarListaEliminados(Pallet pallet)
        {
            for (int i = 0; i < listaPalletsExpedicionEliminados.Count; i++)
            {
                Pallet obj = listaPalletsExpedicionEliminados[i];
                if (obj.getCodigoBarras().Equals(pallet.getCodigoBarras()))
                    listaPalletsExpedicionEliminados.RemoveAt(i);
            }
        }

        private void quitarListaExpedidos(Pallet pallet)
        {
            for (int i = 0; i < listaPalletsExpedicion.Count; i++)
            {
                Pallet obj = listaPalletsExpedicion[i];
                if (obj.getCodigoBarras().Equals(pallet.getCodigoBarras()))
                    listaPalletsExpedicion.RemoveAt(i);
            }
        }

        private bool estaEnListaAgregador(Pallet pallet)
        {
            for (int i = 0; i < listaPalletsExpedicion.Count; i++)
            {
                Pallet obj = listaPalletsExpedicion[i];
                if (obj.getCodigoBarras().Equals(pallet.getCodigoBarras()))
                    return true;
            }
            return false;
        }

        private bool estaEnListaEliminados(Pallet pallet)
        {
            for (int i = 0; i < listaPalletsExpedicionEliminados.Count; i++)
            {
                Pallet obj = listaPalletsExpedicionEliminados[i];
                if (obj.getCodigoBarras().Equals(pallet.getCodigoBarras()))
                    return true;
            }
            return false;
        }

        private ListViewItem crearItemPallet(Pallet nuevoPallet)
        {
            ListViewItem item = new ListViewItem();
            item.Text = nuevoPallet.getCodigoBarras();
            item.SubItems.Add(nuevoPallet.getCodigo());
            //item.SubItems.Add(nuevoPallet.getCodigoZona());
            //item.SubItems.Add(nuevoPallet.getFecha().ToString());
            //item.SubItems.Add(nuevoPallet.getPesoBruto().ToString());
            item.SubItems.Add(nuevoPallet.getPesoNeto().ToString());
            return item;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            
            eliminarElementoSeleccionado();
        }

        private void eliminarElementoSeleccionado()
        {             
            if (listaLotes.SelectedItems.Count == 0)
                return;
            ListViewItem itemSeleccionado = listaLotes.SelectedItems[0];
           
            DialogResult resultado = MessageBox.Show("¿Está seguro que desea quitar el lote?", "Quitar lote", MessageBoxButtons.YesNo);
            if (resultado.Equals(DialogResult.No))
            {
                return;
            }
            expedicionModificada = true;
            Pallet pallet = obtenerPalletPorCodigo(itemSeleccionado.Text);
            if (pallet == null)
            {
                //ha habido un error 
                return;
            }
            expedicion.quitarPallet(pallet);
            listaPalletsExpedicionEliminados.Add(pallet);
            quitarListaExpedidos(pallet);
            listaLotes.Items.Remove(itemSeleccionado);
            textBoxCodigoLote.Focus();
        }

        private Pallet obtenerPalletPorCodigo(string codigo)
        {
            for (int i = 0; i < listaPalletsExpedicion.Count; i++)
            {
                Pallet obj = listaPalletsExpedicion[i];
                if (obj.getCodigoBarras().Equals(codigo))
                    return obj;
            }
            return null;
        }

        private void UserControl1_MouseClick(object sender, MouseEventArgs e)
        {
            textBoxCodigoLote.Focus();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult resultado = MessageBox.Show("¿Está seguro que desea guardar", "Guardar Expedición", MessageBoxButtons.YesNo);
            if (resultado.Equals(DialogResult.Yes)) {
                expedicion.guardar();

                GestorVentanas.getInstancia().cambiarPantalla(new ControlExpediciones());
                
                for (int i = 0; i < listaPalletsExpedicionEliminados.Count; i++)
                {
                    Pallet pallet = listaPalletsExpedicionEliminados[i];
                    GestorConexion.getInstancia().marcarLoteComoNoExpedido((int)pallet.getId());

                }
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (expedicionModificada)
            {
                DialogResult resultado = MessageBox.Show("¿Está seguro que desea salir sin guardar", "Salir de expedición", MessageBoxButtons.YesNo);
                if (resultado.Equals(DialogResult.Yes))
                {
                    GestorVentanas.getInstancia().cambiarPantalla(new ControlExpediciones());
                    
                }
                return;
            }

            GestorVentanas.getInstancia().cambiarPantalla(new ControlExpediciones());
        }

        public bool estaModificadaExpedicion()
        {
            return expedicionModificada;
        }

        //bazofia de codigo a mejorar
        public void redimesiona(int width, int height)
        {
            //Location = new Point(150, 50);
           /* this.Width = width ;
            this.Height = height;
            panelContenedor.Width = width - 30;
            panelContenedor.Height = height ;*/
            /*
            flowLayoutPanel1.Width = width;
            flPanelExpediente.Location = new Point(0, 10);
            flPanelExpediente.Width = width;            

            textBoxExpediente.Width = width - labelFecha.Width - labelExp.Width - textBoxFecha.Width - 50; //40 px de margenes
            textBoxFecha.Location = new Point(width - textBoxFecha.Width, textBoxFecha.Location.Y);

            flPanelCliente.Width = width;
            textBoxCliente.Width = flPanelCliente.Width - label4.Width - 40; //40 px de margen

            flowLayoutPrincipal.Width = width-28; //8 de mas?
            flowLayoutPrincipal.Height = height - 49; //29 de mas?
            flowLayoutPrincipal.Location = new Point(5, 70);
            
            textBoxCodigoLote.Location = new Point(0, 70);            
            textBoxCodigoLote.Width = textBoxCliente.Width;
            flowLayoutPanel3.Width = flowLayoutPrincipal.Width;
            
            flowLayoutPanel3.Location = new Point(10, 70);            
            listaLotes.Width = flowLayoutPanel3.Width - 10;

            double tamanoCol = listaLotes.Width * 0.2;
            
            listaLotes.Columns[0].Width = (int)tamanoCol;
            listaLotes.Columns[1].Width = (int)tamanoCol;
            listaLotes.Columns[2].Width = (int)tamanoCol;
            listaLotes.Columns[3].Width = (int)tamanoCol;
            listaLotes.Columns[4].Width = (int)tamanoCol;

            int offsetY = Math.Abs(flowLayoutPanel3.Location.Y - flowLayoutPrincipal.Location.Y);
            if (offsetY <= 0)
            {
                //fijamos un minimo
                offsetY = 45;
            }

            int altoPanel3 = flowLayoutPrincipal.Height - offsetY;
            flowLayoutPanel3.Height = altoPanel3 - 55;

            listaLotes.Height = flowLayoutPanel3.Height - flowLayoutBotonera.Height - flowLayoutPanelBotonEliminar.Height - label2.Height - textBoxCodigoLote.Height- 20;          
            flowLayoutBotonera.Width = flowLayoutPanel3.Width - 10;
            flowLayoutPanelBotonEliminar.Width = flowLayoutPanel3.Width - 10;
            label2.Location = new Point(0, 0); //mover al principio
            textBoxCodigoLote.Focus();*/
        }

        private void UserControl1_Enter(object sender, EventArgs e)
        {
            textBoxCodigoLote.Focus();
            
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {
            textBoxCodigoLote.Focus();
        }

        private void listBox1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (e.Column == lvwColumnSorter.SortColumn)
            {
                // Reverse the current sort direction for this column.
                if (lvwColumnSorter.Order == SortOrder.Ascending)
                {
                    lvwColumnSorter.Order = SortOrder.Descending;
                }
                else
                {
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }
            }
            else
            {
                // Set the column number that is to be sorted; default to ascending.
                lvwColumnSorter.SortColumn = e.Column;
                lvwColumnSorter.Order = SortOrder.Ascending;
            }

            // Perform the sort with these new sort options.
            this.listaLotes.Sort();
        }
    }
}
